package com.runjian.rundo.iot.agent.common.network.tcp.util;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

/**
 * ByteBuf工具自定义实现
 * 
 * @author CaoQingHua
 */
public final class ByteBufCusUtil {

    /**
     * 插入一个bytes至ByteBuf指定位置
     * 
     * @param originalBuffer 原Buffer
     * @param position 位置
     * @param bytesToAdd 新的bytes
     * @return 新的buffer
     */
    public static ByteBuf insertBytesAtPosition(ByteBuf originalBuffer, int position, byte[] bytesToAdd) {
        // 计算新缓冲区的大小
        int newSize = originalBuffer.readableBytes() + bytesToAdd.length;

        // 创建一个新的 ByteBuf，大小为原来的长度加上新增字节组的长度
        ByteBuf newBuffer = ByteBufAllocator.DEFAULT.directBuffer(newSize);

        // 将原有数据复制到新缓冲区
        newBuffer.writeBytes(originalBuffer.slice(0, position));

        // 插入新的字节组
        newBuffer.writeBytes(bytesToAdd);

        // 将剩余的数据复制到新缓冲区
        newBuffer.writeBytes(originalBuffer.slice(position, originalBuffer.readableBytes() - position));

        // 释放原始的 ByteBuf
        originalBuffer.release();

        return newBuffer;
    }

    /**
     * 插入一个bytes至ByteBuf指定位置
     *
     * @param original 原Buffer
     * @param position 位置
     * @param destination 目标对象
     * @return 新的buffer
     */
    public static ByteBuf insertByteBufAtPosition(ByteBuf original, int position, ByteBuf destination) {
        // 计算新缓冲区的大小
        int newSize = original.readableBytes() + destination.readableBytes();

        // 创建一个新的 ByteBuf，大小为原来的长度加上新增字节组的长度
        ByteBuf newBuffer = ByteBufAllocator.DEFAULT.directBuffer(newSize);

        // 将原有数据复制到新缓冲区
        newBuffer.writeBytes(original.slice(0, position));

        // 插入新的字节组
        newBuffer.writeBytes(destination);

        // 将剩余的数据复制到新缓冲区
        newBuffer.writeBytes(original.slice(position, original.readableBytes() - position));

        // 释放原始的 ByteBuf
        original.release();
        destination.release();

        return newBuffer;
    }

}
